package com.ruoyi.system.mapper;

import java.util.List;

import org.apache.ibatis.annotations.Param;
import com.ruoyi.common.core.domain.entity.SysDept;

/**
 * 部门管理 数据层
 *
 * @author ruoyi
 */
public interface SysDeptMapper {
    /**
     * 查询部门管理数据
     *
     * @param dept 部门信息，用于筛选条件
     * @return 符合条件的部门信息集合
     */
    public List<SysDept> selectDeptList(SysDept dept);

    /**
     * 根据角色ID查询部门树信息
     *
     * @param roleId            角色ID，用于查找与该角色关联的部门
     * @param deptCheckStrictly 部门树选择项是否关联显示，决定父子节点是否联动
     * @return 选中的部门ID列表
     */
    public List<Long> selectDeptListByRoleId(@Param("roleId") Long roleId, @Param("deptCheckStrictly") boolean deptCheckStrictly);

    /**
     * 根据部门ID查询信息
     *
     * @param deptId 部门唯一标识符
     * @return 对应的部门详细信息
     */
    public SysDept selectDeptById(Long deptId);

    /**
     * 根据ID查询所有子部门
     *
     * @param deptId 当前部门ID
     * @return 所有直接或间接子部门列表
     */
    public List<SysDept> selectChildrenDeptById(Long deptId);

    /**
     * 根据ID查询所有子部门（仅限正常状态）
     *
     * @param deptId 当前部门ID
     * @return 正常状态下的子部门数量
     */
    public int selectNormalChildrenDeptById(Long deptId);

    /**
     * 判断指定部门是否存在子节点
     *
     * @param deptId 被检查的部门ID
     * @return 存在子节点返回大于0的结果，否则返回0
     */
    public int hasChildByDeptId(Long deptId);

    /**
     * 检查部门下是否存在用户
     *
     * @param deptId 待检测的部门ID
     * @return 若存在用户则返回大于0的结果，否则返回0
     */
    public int checkDeptExistUser(Long deptId);

    /**
     * 校验同一父级下部门名称是否唯一
     *
     * @param deptName 需要校验的部门名称
     * @param parentId 父级部门ID
     * @return 已存在的同名部门对象，若不存在则返回null
     */
    public SysDept checkDeptNameUnique(@Param("deptName") String deptName, @Param("parentId") Long parentId);

    /**
     * 插入新的部门信息到数据库
     *
     * @param dept 包含新部门信息的对象
     * @return 成功插入记录数
     */
    public int insertDept(SysDept dept);

    /**
     * 更新已有的部门信息
     *
     * @param dept 包含更新后部门信息的对象
     * @return 成功更新记录数
     */
    public int updateDept(SysDept dept);

    /**
     * 将一组部门的状态设置为正常
     *
     * @param deptIds 需要恢复正常的部门ID数组
     */
    public void updateDeptStatusNormal(Long[] deptIds);

    /**
     * 批量更新子部门之间的层级关系
     *
     * @param depts 子部门列表，包含新的层级结构信息
     * @return 成功更新的数量
     */
    public int updateDeptChildren(@Param("depts") List<SysDept> depts);

    /**
     * 删除指定ID的部门信息
     *
     * @param deptId 待删除的部门ID
     * @return 成功删除记录数
     */
    public int deleteDeptById(Long deptId);
}
